home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-07-25 | 5.9 KB | 231 lines | [TEXT/CWIE] |
- // e_system.c
- // 16May1997 e
-
- // OSA AppleScript: compile, execute, display, error, dispose
- // system() uses OSA AppleScript to execute its script arg
-
- // see: IM: Interapplication Communication chapter 10
-
- #include "memory.h"
- #include "str.h"
- #include <errno.h>
- #include <string.h>
-
- static ComponentInstance gScriptingComponent;
-
- static void eOpenCompilingComponent( void )
- {
- ComponentDescription descr;
- Component aComponent;
- ComponentInstance aScriptingComponent;
-
- #ifndef __MC68K__
-
- if( OSACompile == NULL ) // kUnresolvedSymbolAddress
- {
- gScriptingComponent = NULL; // for good measure
- return;
- }
- #endif
-
- descr.componentType = kOSAComponentType;
- descr.componentSubType = kAppleScriptSubtype;
- descr.componentManufacturer = (OSType) 0;
- descr.componentFlags = kOSASupportsCompiling +
- kOSASupportsAECoercion +
- kOSASupportsAESending +
- kOSASupportsConvenience +
- kOSASupportsEventHandling;
- descr.componentFlagsMask = descr.componentFlags;
-
- aComponent = FindNextComponent( NULL, &descr );
-
- if ( aComponent )
- aScriptingComponent = OpenComponent( aComponent );
- if ( aScriptingComponent )
- gScriptingComponent = aScriptingComponent;
- }
-
- #define CHECK_INIT_OSA \
- if( !gScriptingComponent ) \
- { eOpenCompilingComponent(); \
- if( !gScriptingComponent ) { err = errOSACantOpenComponent; goto done; } }
-
- /// ******************************* system *********************************
-
- int e_system( const char *script )
- {
- OSAError err;
- long len;
- AEDesc src = { typeNull, NULL };
- OSAID res = kOSANullScript;
- OSAID obj = kOSANullScript;
-
- CHECK_INIT_OSA
-
- len = strlen( script );
- /*
- src.dataHandle = NewHandle( len );
- src.descriptorType = typeChar;
- if( ! src.dataHandle )
- return -1;
- HLock( src.dataHandle );
- memcpy( *src.dataHandle, script, len );
- HUnlock( src.dataHandle );
- */
- err = AECreateDesc( typeChar, script, len, &src );
- if( err != noErr ) goto done;
-
- // err = OSACompileExecute( gScriptingComponent, &src, kOSANullScript, kOSAModeNull, &rsv );
- // the above would work, but the following is better for MW debugging
-
- err = OSACompile( gScriptingComponent, &src, kOSAModeNull, &obj );
- if( err == noErr )
- {
- err = OSAExecute( gScriptingComponent, obj, kOSANullScript, kOSAModeNull, &res );
- }
- else
- {
- AEDesc dsc;
- OSAScriptError( gScriptingComponent, kOSAErrorMessage, typeChar, &dsc );
- AEDisposeDesc( &dsc );
- }
- OSADispose( gScriptingComponent, obj );
- OSADispose( gScriptingComponent, res );
- done:
- AEDisposeDesc( &src );
- if( err < 0 )
- {
- errno = err;
- return -1;
- }
- return 0;
- }
-
- /// ******************************* scripting *********************************
-
- /*
- OSAID : double;
- OSAError : int;
- OSA_oid : { err : OSAError, id : OSAID };
- OSA_str : { err : OSAError, str : string };
- mac_OSACompile : string -> OSA_oid
- mac_OSAExecute : OSAID -> OSA_oid
- mac_OSADisplay : OSAID -> OSA_str
- mac_OSAScriptError : _ -> OSA_str
- mac_OSADispose : OSAID -> OSAError
- */
-
- #define OSA_REC_SIZE 2
- #define OSA_REC_ERR 0
- #define OSA_REC_ID 1
- #define OSA_REC_STR 1
-
- value mac_OSACompile( value v )
- {
- OSAError err;
- char *script;
- AEDesc src = { typeNull, NULL };
- long len;
- value res;
- OSAID obj = kOSANullScript;
- Push_roots(r, 2);
- r[1] = v;
- r[0] = alloc( OSA_REC_SIZE, 0 );
- CHECK_INIT_OSA
- len = strlen( (script = String_val( r[1] )) );
- err = AECreateDesc( typeChar, script, len, &src );
- if( err == noErr )
- err = OSACompile( gScriptingComponent, &src, kOSAModeNull, &obj );
- AEDisposeDesc( &src );
- done:
- Field (r[0], OSA_REC_ERR) = Val_long( (short )err );
- Field (r[0], OSA_REC_ID) = copy_double( (double )obj );
- res = r[0];
- Pop_roots();
- return res;
- }
-
- value mac_OSAExecute( value v )
- {
- OSAError err;
- OSAID rsv = kOSANullScript;
- OSAID scp = (OSAID )Double_val( v );
- value res;
- Push_roots(r, 1);
- r[0] = alloc( OSA_REC_SIZE, 0 );
- CHECK_INIT_OSA
- err = OSAExecute( gScriptingComponent, scp, kOSANullScript, kOSAModeNull, &rsv );
- done:
- Field (r[0], OSA_REC_ERR) = Val_long( (short )err );
- Field (r[0], OSA_REC_ID) = copy_double( (double )rsv );
- res = r[0];
- Pop_roots();
- return res;
- }
-
- value mac_OSADispose( value v )
- {
- OSAError err;
- OSAID rsv = (OSAID )Double_val( v );
- CHECK_INIT_OSA
- err = OSADispose( gScriptingComponent, rsv );
- done:
- return Val_long( (short )err );;
- }
-
- static value copy_handle( Handle h )
- {
- long len = GetHandleSize( h );
- value str = alloc_string( len );
- HLock( h );
- bcopy( *h, String_val( str ), len );
- HUnlock( h );
- return str;
- }
-
- value mac_OSADisplay( value v ) // kOSAModeDisplayForHumans option?
- {
- OSAError err;
- value res, str;
- OSAID rsv = (OSAID )Double_val( v );
- AEDesc dsc = { typeNull, NULL };
- Push_roots(r, 1);
- r[0] = alloc( OSA_REC_SIZE, 0 );
- CHECK_INIT_OSA
- err = OSADisplay( gScriptingComponent, rsv, typeChar, kOSAModeNull, &dsc );
- str = ( err == noErr ) ? copy_handle( dsc.dataHandle ) : copy_string( "" );
- AEDisposeDesc( &dsc );
- done:
- Field (r[0], OSA_REC_ERR) = Val_long( (short )err );
- Field (r[0], OSA_REC_STR) = str;
- res = r[0];
- Pop_roots();
- return res;
- }
-
- value mac_OSAScriptError( value v )
- {
- #pragma unused( v )
- OSAError err;
- value res, str;
- AEDesc dsc = { typeNull, NULL };
- Push_roots(r, 1);
- r[0] = alloc( OSA_REC_SIZE, 0 );
- CHECK_INIT_OSA
- err = OSAScriptError( gScriptingComponent, kOSAErrorMessage, typeChar, &dsc );
- str = ( err == noErr ) ? copy_handle( dsc.dataHandle ) : copy_string( "" );
- AEDisposeDesc( &dsc );
- err = OSAScriptError( gScriptingComponent, kOSAErrorNumber, typeShortInteger, &dsc );
- if( err == noErr ) err = **(short **)dsc.dataHandle;
- AEDisposeDesc( &dsc );
- done:
- Field (r[0], OSA_REC_ERR) = Val_long( (short )err );
- Field (r[0], OSA_REC_STR) = str;
- res = r[0];
- Pop_roots();
- return res;
- }
-
- // end.
-